//给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。 
//
// 定义一对值 (u,v)，其中第一个元素来自 nums1，第二个元素来自 nums2。 
//
// 找到和最小的 k 对数字 (u1,v1), (u2,v2) ... (uk,vk)。 
//
// 示例 1: 
//
// 输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
//输出: [1,2],[1,4],[1,6]
//解释: 返回序列中的前 3 对数：
//     [1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
// 
//
// 示例 2: 
//
// 输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
//输出: [1,1],[1,1]
//解释: 返回序列中的前 2 对数：
//     [1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]
// 
//
// 示例 3: 
//
// 输入: nums1 = [1,2], nums2 = [3], k = 3 
//输出: [1,3],[2,3]
//解释: 也可能序列中所有的数对都被返回:[1,3],[2,3]
// 
// Related Topics 堆 
// 👍 143 👎 0

package com.leetcode.editor.cn;

import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;

//Java：查找和最小的K对数字
class P373FindKPairsWithSmallestSums {
    public static void main(String[] args) {
        Solution solution = new P373FindKPairsWithSmallestSums().new Solution();
        int nums1[] = {1, 7, 11};
        int nums2[] = {2, 4, 6};
        int k = 3;
        // TO TEST
        solution.kSmallestPairs(nums1, nums2, k);
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
            if (nums1.length == 0 || nums2.length == 0) {
                return new ArrayList<>(new ArrayList<>());
            }
            PriorityQueue<List<Integer>> queue = new PriorityQueue<>(k, (o1, o2) -> (o2.get(0) + o2.get(1)) - (o1.get(0) + o1.get(1)));
            for (int i = 0; i < Math.min(nums1.length, k); i++) {
                for (int j = 0; j < Math.min(nums2.length, k); j++) {
                    if (queue.size() != k || nums1[i] + nums2[j] < queue.peek().get(0) + queue.peek().get(1)) {
                        if (queue.size() == k) {
                            queue.poll();
                        }
                        List<Integer> list = new ArrayList<>();
                        list.add(nums1[i]);
                        list.add(nums2[j]);
                        queue.add(list);
                    }
                }
            }
            List<List<Integer>> list = new ArrayList<>();
            while (!queue.isEmpty() && k > 0) {
                list.add(queue.poll());
                k--;
            }
            return list;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}